package com.shxy.api.controller;

import com.alibaba.fastjson.JSONObject;
import com.shxy.api.bean.news.CatalogBean;
import com.shxy.api.common.ApiResult;
import com.shxy.api.common.ResultCode;
import com.shxy.api.service.INewsService;
import lombok.extern.java.Log;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 栏目管理控制器
 */
@RestController
@RequestMapping("/v1/catalog")
@Validated
@Log
public class CatalogController {
    @Autowired
    private INewsService newsService;

    /**
     * 添加栏目
     * @param name 名称
     * @param parentId 父节点
     * @return
     */
    @PostMapping("/add")
    public ApiResult addCatalog(@RequestParam @NotBlank(message = "栏目名称不能为空") String name,
                                @RequestParam(name = "parentId", defaultValue = "") String parentId) {
        // 1、处理名称
        name = StringUtils.trimToEmpty(name);

        // 2、如果栏目已存在
        if(newsService.isCatalogExist(name, parentId)) {
            return ApiResult.create(ResultCode.CATALOG_EXISTS);
        }

        // 3、保存并返回
        newsService.addCatalog(name, parentId);
        return ApiResult.success();
    }

    /**
     * 获取栏目子节点列表
     * @param id 父节点编号
     * @return
     */
    @GetMapping("/list/{id}")
    public ApiResult getCatalogNodes(@PathVariable(name = "id") String id) {
        List<CatalogBean> list = new ArrayList<>();
        // 1、如果是获取全部
        if(id.equals("all")) {
            list = newsService.getCatalogsAll();
        }
        // 2、如果该节点存在
        else if(newsService.isCatalogExist(id)) {
            list = newsService.getChildrenCatalogs(id);
        }

        return ApiResult.create(convertCatalogs(list));
    }

    /**
     * 更改栏目名称
     * @param id 编号
     * @param name 名称
     * @return
     */
    @PostMapping("/modify/name/id/{id}")
    public ApiResult modifyCatalogName(@PathVariable(name = "id") String id, @RequestParam String name) {
        // 1、如果该栏目不存在，则返回错误
        if(!newsService.isCatalogExist(id)) {
            return ApiResult.create(ResultCode.CATALOG_NOT_EXISTS);
        }

        // 2、如果该栏目名称重复，则返回错误
        if(newsService.isCatalogExist(name, id)) {
            return ApiResult.create(ResultCode.CATALOG_EXISTS);
        }

        // 3、修改栏目名称并返回
        newsService.modifyCatalogName(id, name);
        return ApiResult.success();
    }

    /**
     * 栏目移动
     * @param id 编号
     * @param parentId 父节点编号
     * @return
     */
    @GetMapping("/move/id/{id}")
    public ApiResult moveCatalog(@PathVariable(name = "id") String id,
                                 @RequestParam(name = "parentId", defaultValue = "", required = false) String parentId) {
        log.info("parentId=" + parentId);
        // 1、如果指定节点或父节点不为空且不存在
        if(!newsService.isCatalogExist(id) || (!parentId.equals("") && !newsService.isCatalogExist(parentId))) {
            ApiResult.create(ResultCode.CATALOG_NOT_EXISTS);
        }
        // 2、移动节点
        newsService.moveCatalog(id, parentId);
        return ApiResult.success();
    }

    /**
     * 删除栏目
     * @return
     */
    @GetMapping("/delete/all")
    public ApiResult deleteCatalogAll() {
        int n = newsService.deleteCatalogAll();
        return ApiResult.create(n);
    }

    /**
     * 根据编号删除栏目
     * @param id 编号
     * @return
     */
    @GetMapping("/delete/id/{id}")
    public ApiResult deleteCatalogById(@PathVariable(name = "id") String id) {
        newsService.deleteCatalogById(id);
        return ApiResult.success();
    }

    /**
     * 转换栏目格式
     * @param catalog 栏目
     * @return
     */
    private JSONObject convertCatalog(CatalogBean catalog) {
        // 1、构建格式
        JSONObject mp = new JSONObject();
        mp.put("id", catalog.getId());
        mp.put("name", catalog.getName());
        // 2、如果存在父节点，则显示父节点编号
        if(catalog.getParent() != null) {
            mp.put("parentId", catalog.getParent().getId());
        }
        // 3、如果其包含子节点
        if(catalog.getChildrenList() != null && !catalog.getChildrenList().isEmpty()) {
            List<Map> children = new ArrayList<>();
            catalog.getChildrenList().stream().forEach(catalogBean -> {
                children.add(convertCatalog(catalogBean));
            });
            mp.put("children", children);
        }
        return mp;
    }

    /**
     * 类别格式转换
     * @param list
     * @return
     */
    private List<JSONObject> convertCatalogs(List<CatalogBean> list) {
        ArrayList<JSONObject> maps = new ArrayList<>();
        for (CatalogBean c: list) {
            maps.add(convertCatalog(c));
        }
        return maps;
    }
}
